const { ipcMain, net } = require('electron');
const config = require('../config');
let App = null;
const proxy = config.proxy;
function parseParam(param, key) {
    let paramStr = "";
    const paramType = typeof param;
    if (paramType === 'string' || paramType === 'boolean' || paramType === 'number') {
        paramStr += "&" + key + "=" + encodeURIComponent(param);
    } else {
        for (let i in param) {
            //console.log(JSON.stringify(param[i]));
            let k = key == null ? i : key + (param instanceof Array ? "[" + i + "]" : "." + i);
            paramStr += '&' + parseParam(param[i], k);
        }
    }
    return paramStr.substr(1);
};
function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = array.length;
    i = 0;
    while(i < len) {
        c = array[i++];
        switch(c >> 4)
        {
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
            out += String.fromCharCode(c);
            break;
            case 12: case 13:
// 110x xxxx 10xx xxxx
            char2 = array[i++];
            out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
            break;
            case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
                char2 = array[i++];
                char3 = array[i++];
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
        }
    }

    return out;
}
function fetch(action, params, { type }) {
    let actionProxy = /^\$\{(.*)\}/.exec(action);
    if (action.substr(0, 4) !== 'http' && actionProxy) {
        action = action.replace(`\${${actionProxy[1]}}`, proxy[actionProxy[1]])
    }
    console.log(`${action}?${parseParam(params)}`)
    return new Promise((resolve, reject) => {
        const request = net.request(`${action}?${parseParam(params)}`);
        request.on('response', (response) => {
            let result = '';
            response.on('data', (chunk) => {
                result += Utf8ArrayToStr(chunk);
            });
            response.on('end', () => {
                try {
                    resolve({ data: type === 'json' ? JSON.parse(result) : result });
                } catch (e) {
                    reject({ data: e });
                }

            });
        });
        request.end();
    });
}
function listenNetRequest() {
    ipcMain.handle('user-net-request', async (event, arg) => {
        const {
            action, headers, method = 'GET', params, type = 'text'
        } = arg;
        const result = await fetch(action, params, { type, headers });
        return result;
    });
}



exports.use = function(app) {
    App = app;
    listenNetRequest();
}
